package com.gdust.gkyx.acl.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gdust.gkyx.acl.service.AdminService;
import com.gdust.gkyx.acl.service.RoleService;
import com.gdust.gkyx.common.result.Result;
import com.gdust.gkyx.common.utils.MD5;
import com.gdust.gkyx.model.acl.Admin;
import com.gdust.gkyx.vo.acl.AdminQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * ClassName: AdminController
 * Package: com.gdust.gkyx.acl.controller
 * Description:用户管理接口开发
 *
 * //见前端：src/api/acl路径下user.js进行接口编写
 *
 * @Author syun
 * @Create 2025/1/21 19:34
 * @Version 1.0
 */
@Api(tags = "用户接口")
@RestController// @RestController: 专用于restful风格的注解 = @Controller (控制器) + @ResponseBody (方法返回值为json)
@RequestMapping("/admin/acl/user")
//@CrossOrigin //跨域
public class AdminController {
    //注入用户表的service
    @Autowired
    private AdminService adminService;

    //注入角色表的service
    @Autowired
    private RoleService roleService;



    /**
     *     //1 用户列表
     * //    url: `${api_name}/${page}/${limit}`,
     * //    method: 'get',
     * //    params: searchObj
     * @param current 当前页
     * @param limit 每页记录数
     * @param adminQueryVo 查询条件
     * @return
     */
    @ApiOperation("分页查询用户列表")
    @GetMapping("{current}/{limit}")
    public Result list(@PathVariable Long current,
                       @PathVariable Long limit,
                       AdminQueryVo adminQueryVo) {
        //1 创建page对象，传递当前页和每页记录数
        // current：当前页
        // limit: 每页显示记录数
        Page<Admin> pageParam = new Page<Admin>(current,limit);
        //2 自定义方法：调用service方法实现条件分页查询，返回分页对象
        IPage<Admin> pageModel = adminService.selectPageUser(pageParam,adminQueryVo);
        return Result.ok(pageModel);
    }


    /**
     *     //2 id查询用户
     * //    url: `${api_name}/get/${id}`,
     * //    method: 'get'
     * @param id 会员id
     * @return
     */
    @ApiOperation("根据id查询用户")
    @GetMapping("get/{id}")
    public Result get(@PathVariable Long id) {
        Admin admin = adminService.getById(id);
        return Result.ok(admin);
    }

    /**
     *     //3 添加用户
     * //    url: `${api_name}/save`,
     * //    method: 'post',
     * //    data: user --- 通过JSON格式传输数据，接收JSON格式数据封装到Admin对象中
     * @param admin 用户类
     * @return
     */
    @ApiOperation("添加用户")
    @PostMapping("save")
    @Transactional
    public Result save(@RequestBody Admin admin) {
        if (admin.getPassword()==null){
            throw new RuntimeException("请输入密码");
        }

        //获取输入的密码
        String password = admin.getPassword();

        //对输入密码进行加密 MD5
        String passwordMD5 = MD5.encrypt(password);

        //设置到admin对象里面
        admin.setPassword(passwordMD5);

        //调用方法添加
        boolean is_success = adminService.save(admin);
        if(is_success) {
            return Result.ok(null);
        } else {
            return Result.fail(null);
        }
    }

    /**
     *     //4 修改用户
     * //    url: `${api_name}/update`,
     * //    method: 'put',
     * //    data: user
     * @param admin 用户类
     * @return
     */
    @ApiOperation("修改用户")
    @PutMapping("update")
    @Transactional
    public Result update(@RequestBody Admin admin) {
        if(admin.getPassword() != null){
            //获取输入的密码
            String password = admin.getPassword();

            //对输入密码进行加密 MD5
            String passwordMD5 = MD5.encrypt(password);

            //设置到admin对象里面
            admin.setPassword(passwordMD5);
        }


        boolean is_success = adminService.updateById(admin);
        if(is_success) {
            return Result.ok(null);
        } else {
            return Result.fail(null);
        }
    }

    /**
     *     //5 id删除
     * //    url: `${api_name}/remove/${id}`,
     * //    method: 'delete'
     * @param id 会员id
     * @return
     */
    @ApiOperation("根据id删除用户")
    @DeleteMapping("remove/{id}")
    @Transactional
    public Result remove(@PathVariable Long id) {
        boolean is_success = adminService.removeById(id);
        if(is_success) {
            return Result.ok(null);
        } else {
            return Result.fail(null);
        }
    }

    /**
     *     //6 批量删除
     * //    url: `${api_name}/batchRemove`,
     * //    method: 'delete',
     * //    data: ids
     *     // json数组[1,2,3]  --- JSON的数组格式对应java的list集合 List<Long> idList
     * @param idList id的list集合
     * @return
     */
    @ApiOperation("批量删除用户")
    @DeleteMapping("batchRemove")
    @Transactional
    public Result batchRemove(@RequestBody List<Long> idList) {
        boolean is_success = adminService.removeByIds(idList);
        if(is_success) {
            return Result.ok(null);
        } else {
            return Result.fail(null);
        }
    }

    //用户分配角色接口分为：(1)获取所有角色和根据用户id查询用户已经分配角色列表。(2)为用户进行角色分配
    /**
     * 用户分配角色接口
     *
     * //(1)获取所有角色，和根据用户id查询用户分配角色列表
     * //    url: `${api_name}/toAssign/${adminId}`,
     * //    method: 'get'
     * @param adminId 会员id
     * @return
     */
    @ApiOperation("获取用户角色")
    @GetMapping("toAssign/{adminId}")
    public Result toAssign(@PathVariable Long adminId) {
        //自定义方法。返回map集合包含两部分数据：所有角色 和 为用户分配角色列表
        Map<String,Object> map  = roleService.getRoleByAdminId(adminId);
        return Result.ok(map);
    }


    /**
     * 用户分配角色接口
     *
     * //(2)为用户进行分配
     * //    url: `${api_name}/doAssign`,
     * //    method: 'post',
     * //    params: {
     * //        adminId,
     * //        roleId
     * //    }
     *     //参数有用户id 和 多个角色id ---多个角色id用数组形式传递
     *
     * @RequestParam 用于从 HTTP 请求中提取参数。如果后端方法的参数名与前端传递的参数名不一致，
     * 并且没有使用 @RequestParam 注解的 value 属性指定映射关系，就会导致匹配失败，从而抛出 400 Bad Request 或类似的错误。
     *
     * @param adminId 会员id
     * @param roleId 角色id
     * @return
     */
    @ApiOperation("为用户进行角色分配")
    @PostMapping("doAssign")
    public Result doAssign(@RequestParam Long adminId,
                           @RequestParam Long[] roleId) {
        //自定义方法。为用户进行角色分配
        roleService.saveAdminRole(adminId,roleId);
        return Result.ok(null);
    }


}
